package com.zjj.lbw.interview.ideology.simulation;

/**
 * @author zhanglei.zjj
 * @description 香槟塔
 * 我们把玻璃杯摆成金字塔的形状，其中第一层有1个玻璃杯，第二层有2个，依次类推到第100层，每个 玻璃杯(250ml)将盛有香槟。
 * 从顶层的第一个玻璃杯开始倾倒一些香槟，当顶层的杯子满了，任何溢出的香槟都会立刻等流量的流向 左右两侧的玻璃杯。
 * 当左右两边的杯子也满了，就会等流量的流向它们左右两边的杯子，依次类推。 （当最底层的玻璃杯满了，香槟会流到地板上）
 *  例如，在倾倒一杯香槟后，最顶层的玻璃杯满了。倾倒了两杯香槟后，第二层的两个玻璃杯各自盛放一 半的香槟。在倒三杯香槟后，
 *  第二层的香槟满了 - 此时总共有三个满的玻璃杯。在倒第四杯后，第三层 中间的玻璃杯盛放了一半的香槟，他两边的玻璃杯各自盛放了四分之一的香槟
 * * @date 2023/9/8 9:37
 */
public class ChampagneTower {
    /**
     *
     * @param poured 总共倒入酒的倍数
     * @param query_row 要查询酒杯的横坐标
     * @param query_glass 要查询酒杯的纵坐标
     * @return
     */
    public static double champagneTower(int poured, int query_row, int query_glass) {
        if (poured <= 0 || query_row < 0 || query_glass < 0) {
            return 0;
        }
        double[][] cap = new double[100][100];
        cap[0][0] = poured;
        for (int i = 0; i < query_row; i++) {
            for (int j = 0; j <= i; j++) {
                double overflow = (cap[i][j] - 1.0) / 2;
                // 大于0可以往下溢出
                if (overflow > 0) {
                    cap[i + 1][j] += overflow;
                    cap[i + 1][j + 1] += overflow;
                }
            }
        }

        return Math.min(1.0, cap[query_row][query_glass]);
    }

    public static void main(String[] args) {
        System.out.println(champagneTower(5, 2, 2));
    }
}
